/**
 * 统计控制器
 * @module controllers/stats
 */

const Stats = require('../models/stats.model');
const logger = require('../utils/logger');
const { createError } = require('../utils/error');

/**
 * 记录工具使用
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express中间件函数
 */
exports.recordUsage = async (req, res, next) => {
  try {
    // 获取当前用户ID
    const userId = req.user.id;
    
    // 从请求体获取使用数据
    const { toolType, operationType, metadata } = req.body;
    
    // 验证必填字段
    if (!toolType || !operationType) {
      return next(createError(400, '工具类型和操作类型不能为空'));
    }
    
    // 记录工具使用
    const usage = await Stats.recordUsage(userId, toolType, operationType, metadata || {});
    
    res.status(200).json({
      success: true,
      data: usage
    });
  } catch (err) {
    logger.error(`记录工具使用失败: ${err.message}`, { stack: err.stack });
    next(createError(500, '记录工具使用失败'));
  }
};

/**
 * 获取用户的使用统计
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express中间件函数
 */
exports.getUserStats = async (req, res, next) => {
  try {
    // 获取当前用户ID
    const userId = req.user.id;
    
    // 获取时间范围参数
    const { timeRange } = req.query;
    
    // 获取用户使用统计
    const stats = await Stats.getUserStats(userId, timeRange || 'all');
    
    res.status(200).json({
      success: true,
      data: stats
    });
  } catch (err) {
    logger.error(`获取用户统计失败: ${err.message}`, { stack: err.stack });
    next(createError(500, '获取用户统计失败'));
  }
};

/**
 * 管理员: 获取系统总体使用统计
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express中间件函数
 */
exports.getSystemStats = async (req, res, next) => {
  try {
    // 验证用户是否是管理员
    if (!req.user.isAdmin) {
      return next(createError(403, '无权限访问'));
    }
    
    // 获取时间范围参数
    const { timeRange } = req.query;
    
    // 获取系统使用统计
    const stats = await Stats.getSystemStats(timeRange || 'all');
    
    res.status(200).json({
      success: true,
      data: stats
    });
  } catch (err) {
    logger.error(`获取系统统计失败: ${err.message}`, { stack: err.stack });
    next(createError(500, '获取系统统计失败'));
  }
};

/**
 * 管理员: 获取每日活跃用户数统计
 * @param {Object} req - Express请求对象
 * @param {Object} res - Express响应对象
 * @param {Function} next - Express中间件函数
 */
exports.getDailyActiveUsers = async (req, res, next) => {
  try {
    // 验证用户是否是管理员
    if (!req.user.isAdmin) {
      return next(createError(403, '无权限访问'));
    }
    
    // 获取天数参数
    const days = parseInt(req.query.days) || 30;
    
    // 获取每日活跃用户数统计
    const stats = await Stats.getDailyActiveUsers(days);
    
    res.status(200).json({
      success: true,
      data: stats
    });
  } catch (err) {
    logger.error(`获取每日活跃用户数统计失败: ${err.message}`, { stack: err.stack });
    next(createError(500, '获取每日活跃用户数统计失败'));
  }
}; 